
import java.applet.Applet;  
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Date;
import nucleo.*;

/**
 *
 * @author OsomGames
 * @date 18-07-2011
 */
public class Juego extends Applet implements Runnable, KeyListener {
    // Hilo del juego
    private Thread th;
    
    // Zona a usar
    Zona zona1 = new Zona();
    
    // Jugador
    Personaje jugador;
    
    //Por ahora crearemos y cargaremos la zona en el propio codigo
    String[] zonaPrueba = new String[9];
    
    /**
     * La carga de archivos, inicializaciones de la zona, sprites
     * y demases se realiza en esta funcion
     *
     */
    
    @Override
    public void init() {
        // El nivel, que quereis que os ponga aqui? os odio 
        // tantos comentarios y la puta ostia
        zonaPrueba[0] = "----------------------------------------";
        zonaPrueba[1] = "-BBB--B---------------------------------";
        zonaPrueba[2] = "-B----B---------------------------------";
        zonaPrueba[3] = "-B--BBB---------------------------------";
        zonaPrueba[4] = "-BB----B--------------------------------";
        zonaPrueba[5] = "---BB--B--------------------------------";
        zonaPrueba[6] = "BBBB--BB--------------------------------";
        zonaPrueba[7] = "B----B----------------------------------";
        zonaPrueba[8] = "----------------------------------------";
        
        // Pasamos por parametro el applet en si 
        th = new Thread(this);
        
        // Crear una zona
        zona1.crearZona(zonaPrueba, "prueba");
        
        // Se carga la zona
        zona1.cargarZona("prueba");
       
        //Creamos el jugador
        jugador= new Personaje("k_reposo.png",50,0,50,50,2,7);
        
        // El listener del teclado, mas claro agua no?
        addKeyListener(this);
        
        // Añadimos el jugador y otros personajes a la zona
        jugador.añadirAZona(zona1);
    }

    /**
     * El inicio de la aplicacion
     */
    @Override
    public void start() {
        //Iniciamos el hilo del juego.
        //Esto lleva consigo al llamamiento de la funcion run()
        th.start();
    }

    /**
     * La funcion encargada de mostrar por pantalla
     * @param g 
     */
    @Override
    public void paint(Graphics g) {
        this.setSize(400, 400);
        // Vamos a usar Graphics2D. Tiene mas cosicas
        Graphics2D g2d = (Graphics2D) g;
        //Llamamos a la funcion de pintar la zona completa
        zona1.pintarZona(g2d, this);
    }
    // Atributos para doble buffer
    private Image dbImage;
    private Graphics dbg;

    /**
     * Para el doble buffer. NO TOCAR
     * @param g 
     */
    @Override
    public void update(Graphics g) {
        if (dbImage == null) {
            dbImage = createImage(this.getSize().width, this.getSize().height);
            dbg = dbImage.getGraphics();
        }
        dbg.setColor(getBackground());
        dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);

        dbg.setColor(getForeground());
        paint(dbg);
        g.drawImage(dbImage, 0, 0, this);
    }

    /**
     * El metodo principal del juego. 
     * Aqui se actualizara la logica del juego.
     * 
     */
    @Override
    public void run() {

        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        int maxFPS = 25;
        long nextRepaintDue = 0;
        while (true) {
            if (nextRepaintDue > (new Date()).getTime()) {
                try {
                    Thread.sleep(nextRepaintDue - (new Date()).getTime());
                } catch (InterruptedException e) {
                    System.out.println("Error: " + e);
                }
            }
            nextRepaintDue = (new Date()).getTime() + 1000 / maxFPS;
            
            // CONTROLAME EL SALTO
            jugador.actualizarMovimiento();
            
            //zona1.controlarEspacio();
            //Y aqui al final se repinta todo chachi piruli
            repaint();
        }
    }

    /**
     * Cuando pulsas un boton del teclado
     * Aqui dentro estaran las llamadas a las funciones de movimiento
     * 
     * @param e Evento
     */
    @Override
    public void keyPressed(KeyEvent e) {
        //Pa la izquierda
        if((e.getKeyCode()==KeyEvent.VK_A)||(e.getKeyCode()==KeyEvent.VK_A)){
            jugador.mover(Movimiento.IZQUIERDA);
        }
        //Pa la derecha
        else if((e.getKeyCode()==KeyEvent.VK_D)||(e.getKeyCode()==KeyEvent.VK_D)){
            jugador.mover(Movimiento.DERECHA);
        }
        //Pa saltar
        if(e.getKeyCode()==KeyEvent.VK_SPACE){
            jugador.mover(Movimiento.ESPACIO);
        }
        
    }
    /**
     * Cuando sueltas un boton del teclado
     * Y aqui dentro pondremos las funciones para que deje de moverse
     * @param e Evento
     */
    @Override
    public void keyReleased(KeyEvent e) {
         //Pa la izquierda
        if((e.getKeyCode()==KeyEvent.VK_A)||(e.getKeyCode()==KeyEvent.VK_A)){
            jugador.detenerMover(Movimiento.IZQUIERDA);
        }
        //Pa la derecha
        else if((e.getKeyCode()==KeyEvent.VK_D)||(e.getKeyCode()==KeyEvent.VK_D)){
            jugador.detenerMover(Movimiento.DERECHA);
        }
    }
    
    /**
     * En verdad, ni puta idea
     * sera si dejas pulsado un boton
     * @param e Evento
     */
    @Override
    public void keyTyped(KeyEvent e) {
        
    }
    
}
